package com.gs.common.mapper;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.gs.entity.BaseEntity;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import java.util.List;
import java.util.Map;

/**
 * @title: 孙杨申
 * @date 2022/1/13 21:15
 */

public interface CommonMapper<T, V> extends BaseMapper<T> {

    /**
     * T 代表 entity
     * V 代表 dto
     * @param sqlStr
     * @return
     */
    @Select("${sqlStr}")
    List<T> list(@Param("sqlStr") String sqlStr);

    @Select("${sqlStr}")
    <K> K get(@Param("sqlStr") String sqlStr, Class<K> kClass);

    @Select("${sqlStr}")
    <K> List<K> list(@Param("sqlStr") String sqlStr, Class<K> kClass);

    @Select("${sqlStr}")
    List<Map<String, Object>> listMap(@Param("sqlStr") String sqlStr);

    @Select("${sqlStr}")
    T getById(@Param("sqlStr") String sqlStr);

    @Select("${sqlStr}")
    List<V> listDto(@Param("sqlStr") String sqlStr);

    @Select("${sqlStr}")
    V getDto(@Param("sqlStr") String sqlStr);

    @Select("${sqlStr}")
    Integer count(@Param("sqlStr") String sqlStr);

    default Integer count() {
        QueryWrapper<T> wrapper = new QueryWrapper<>();
        wrapper.select("id");
        return selectCount(wrapper);
    }

    /**
     * id为null就插入, id不为null就更新
     * @param t
     */
    default void insertOrUpdate(T t) {
        if(t instanceof BaseEntity) {
            BaseEntity baseEntity = (BaseEntity) t;
            if(baseEntity.getId() == null) {
                insert(t);
            } else {
                updateById(t);
            }

        } else throw new RuntimeException("不是BaseEntity的子类");

    }
}
